/*
 * Solo - A small and beautiful blogging system written in Java.
 * Copyright (c) 2010-present, b3log.org
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
/**
 * @fileoverview timeline js.
 *
 * @author <a href="http://vanessa.b3log.org">Liyuan Li</a>
 * @version 1.1.0.0, Aug 2, 2019
 */
var timeline = {
    _COLHA: 0,
    _COLHB: 20,
    _initArticleList: function() {
        var $articles = $(".articles");
        if ($articles.length === 0 || $(".articles > .fn-clear").length > 0) {
            return;
        }

        $(window).resize(function() {
            if ($("#hideTop").css("top") === "auto") {
                var colH = [timeline._COLHA, timeline._COLHB];
                $articles.find("article").each(function() {
                    var $it = $(this),
                            isLeft = colH[1] > colH[0],
                            top = isLeft ? colH[0] : colH[1];
                    if (parseInt($it.css("top")) !== top || top === 0) {
                        $it.css({
                            "top": top + "px",
                            "position": "absolute"
                        });

                        if (isLeft) {
                            this.className = "l";
                        } else {
                            this.className = "r";
                        }
                    }
                    colH[(isLeft ? '0' : '1')] += parseInt($it.outerHeight(true));
                });

                $articles.height(colH[0] > colH[1] ? colH[0] : colH[1]);
            } else {
                $articles.find("article").each(function() {
                    $(this).css({
                        "position": "inherit",
                        "top": "auto"
                    }).removeClass("r l");
                });
                $articles.css("height", "auto");
            }
        });

        $(window).resize();
        $(".module img").imagesLoaded(function() {
            $(window).resize();
        });
    },
    _initIndexList: function() {
        var $archives = $(".articles > .fn-clear");
        if ($archives.length === 0) {
            return;
        }

        // 如果为 index 页面，重构 archives 结构，使其可收缩
        var year = 0;
        $(".nav-abs li").each(function(i) {
            var $this = $(this);
            $this.hide();
            if (year !== $this.data("year")) {
                year = $this.data("year");
                $this.before("<li class='close year' onclick='timeline.toggleArchives(this, " +
                        year + ")'>" + year + "</li>");
            }
        });

        // 首次加载时，当没有下一页时，使用 js 隐藏"更多"按钮 
        if ($(".article-more").parent().data("count") <= $(".article-more").parent().find("article").length) {
            $(".article-more").remove();
        }

        $(window).resize(function() {
            $archives.each(function() {
                if ($("#hideTop").css("top") === "auto") {
                    var colH = [timeline._COLHA + 60, timeline._COLHB * 4];

                    var $articles = $(this).find("article");
                    if ($articles.length === 0) {
                        $(this).find("h2").remove();
                        $(this).css("margin-bottom", 0);
                    } else {
                        $articles.each(function() {
                            var $it = $(this),
                                    isLeft = colH[1] > colH[0],
                                    top = isLeft ? colH[0] : colH[1];

                            if (parseInt($it.css("top")) !== top || top === 0) {
                                $it.css({
                                    "top": top + "px",
                                    "position": "absolute"
                                });

                                if (isLeft) {
                                    this.className = "l";
                                } else {
                                    this.className = "r";
                                }
                            }
                            colH[(isLeft ? '0' : '1')] += parseInt($it.outerHeight(true));
                        });
                        $(this).height(colH[0] > colH[1] ? colH[0] : colH[1]);
                    }
                } else {
                    var $articles = $(this).find("article");
                    if ($articles.length === 0) {
                        $(this).find("h2").remove();
                        $(this).css("margin-bottom", 0);
                    } else {
                        $articles.each(function() {
                            $(this).css({
                                "position": "inherit",
                                "top": "auto"
                            }).removeClass("r l");
                        });
                        $(this).css("height", "auto");
                    }
                }
            });
        });

        $(window).resize();
        $(".module img").imagesLoaded(function() {
            $(window).resize();
        });
    },
    _setNavCurrent: function() {
        $(".header li a").each(function() {
            if ($(this).prop("href") === location.href.split("#")[0]) {
                this.className = "current";
            } else {
                this.className = "";
            }
        })
    },
    init: function() {
        $(window).scroll(function() {
            if ($(window).scrollTop() > 60) {
                $(".ico-top").show();
            } else {
                $(".ico-top").hide();
            }
        });
        timeline._initIndexList();
        timeline._initArticleList();
        timeline._setNavCurrent();

        // init header list 
        $(".ico-list").click(function() {              
            if ($(".header > .container > form").css("height") === "0px") {
                $(".header > .container > ul, .header > .container > form").css({
                  "height": "auto"
                });
            } else {
                $(".header > .container > ul, .header > .container > form").animate({
                  "height": "0px"  
                });
            } 
        });
    },
    translate: function() {
        window.open("http://translate.google.com/translate?sl=auto&tl=auto&u=" + location.href);
    },
    getArchive: function(year, month, monthName) {
        var archiveDate = year + month,
                archive = year + "/" + month;
        window.location.hash = "#" + archiveDate;
        if ($("#" + archiveDate + " > article").length === 0) {
            var archiveDataTitle = year + " " + Label.yearLabel + " " + month + " " + Label.monthLabel;
            if (Label.localeString.substring(0, 2) === "en") {
                archiveDataTitle = monthName + " " + year;
            }
            var archiveHTML = '<h2><span class="article-archive">' + archiveDataTitle + '</span></h2>'
                    + '<div class="article-more" onclick="timeline.getNextPage(this, \''
                    + archive + '\')" data-page="0">' + Label.moreLabel + '</div>';

            $("#" + archiveDate).html(archiveHTML).css("margin-bottom", "50px");
            timeline.getNextPage($("#" + archiveDate).find(".article-more")[0], archive);
        }
    },
    getNextPage: function(it, archive) {
        var $more = $(it),
                currentPage = $more.data("page") + 1,
                path = "/articles/";
        if ($("#tag").length === 1) {
            var pathnames = location.pathname.split("/");
            path = "/articles/tags/" + pathnames[pathnames.length - 1];
        } else if ($("#author").length === 1) {
            var pathnames = location.pathname.split("/");
            path = "/articles/authors/" + pathnames[pathnames.length - 1];
        } else if ($("#category").length === 1) {
            var pathnames = location.pathname.split("/");
            path = "/articles/category/" + pathnames[pathnames.length - 1];
        } else if (archive) {
            path = "/articles/archives/" + archive;
        }
        $.ajax({
            url: Label.servePath + path + '?p=' + currentPage,
            type: "GET",
            beforeSend: function() {
                $more.css("background",
                        "url(" + Label.staticServePath
                        + "/skins/timeline/images/ajax-loader.gif) no-repeat scroll center center #60829F").text("");
            },
            success: function(result, textStatus) {
                if (!result.sc) {
                    $more.css("background", "none #60829F").text("Error");
                    return;
                }

                if (result.rslts.articles.length === 0) {
                    $more.remove();
                    return;
                }

                var articlesHTML = "",
                        pagination = result.rslts.pagination;

                // append articles
                for (var i = 0; i < result.rslts.articles.length; i++) {
                    var article = result.rslts.articles[i];

                    articlesHTML += '<article><div class="module"><div class="dot"></div>'
                            + '<div class="arrow"></div><time class="article-time"><span>'
                            + Util.toDate(article.articleCreateTime, 'yy-MM-dd HH:mm')
                            + '</span></time><h3 class="article-title"><a rel="bookmark" href="'
                            + Label.servePath + article.articlePermalink + '">'
                            + article.articleTitle + '</a>';

                    if (article.articlePutTop) {
                        articlesHTML += '<sup>' + Label.topArticleLabel + '</sup>';
                    }

                    if (article.hasUpdated) {
                        articlesHTML += '<sup><a href="'
                          + Label.servePath + article.articlePermalink + '">' + Label.updatedLabel + '</a></sup>';
                    }

                    articlesHTML += '</h3><p>' + article.articleAbstract + '</p>'
                            + '<span class="ico-tags ico" title="' + Label.tagLabel + '">';

                    var articleTags = article.articleTags.split(",");
                    for (var j = 0; j < articleTags.length; j++) {
                        articlesHTML += '<a rel="category tag" href="' + Label.servePath
                                + '/tags/' + encodeURIComponent(articleTags[j]) + '">' + articleTags[j] + '</a>';

                        if (j < articleTags.length - 1) {
                            articlesHTML += ",";
                        }
                    }

                    articlesHTML += '</span>&nbsp;<span class="ico-author ico" title="' + Label.authorLabel + '">'
                            + '<a rel="author" href="' + Label.servePath + '/authors/' + article.authorId + '">'
                            + article.authorName + '</a></span>&nbsp;<span class="ico-comment ico" title="'
                            + Label.commentLabel + '"><a rel="nofollow" href="' + Label.servePath + article.articlePermalink
                            + '#comments">' + (article.articleCommentCount === 0 ? Label.noCommentLabel : article.articleCommentCount)
                            + '</a></span>&nbsp;<span class="ico-view ico" title="' + Label.viewLabel + '">'
                            + '<a rel="nofollow" href="${servePath}${article.articlePermalink}">' + article.articleViewCount
                            + '</a></span></div></article>';
                }

                $more.before(articlesHTML).data("page", currentPage);
                // 最后一页处理
                if (pagination.paginationPageCount <= currentPage) {
                    $more.remove();
                } else {
                    $more.css("background", "none #60829F").text(Label.moreLabel);
                }

                $(window).resize();
                $(".module img").imagesLoaded(function() {
                    $(window).resize();
                });
            }
        });
    },
    toggleArchives: function(it, year) {
        $(".nav-abs li").each(function(i) {
            var $it = $(this);
            if (!$it.hasClass("year")) {
                $it.hide();
                if (year === $it.data("year") && $(it).hasClass("close")) {
                    $it.show();
                }
            }
        });

        $(".nav-abs li.year").each(function() {
            if (parseInt($(this).text()) === year) {
                if ($(it).hasClass("close")) {
                    it.className = "year open";
                } else {
                    it.className = "year close";
                }
            } else {
                this.className = "year close";
            }
        });
    }
};

/*!
 * jQuery imagesLoaded plugin v2.1.1
 * http://github.com/desandro/imagesloaded
 *
 * MIT License. by Paul Irish et al.
 */

/*jshint curly: true, eqeqeq: true, noempty: true, strict: true, undef: true, browser: true */
/*global jQuery: false */

;
(function($, undefined) {
    'use strict';

    // blank image data-uri bypasses webkit log warning (thx doug jones)
    var BLANK = '';

    $.fn.imagesLoaded = function(callback) {
        var $this = this,
                deferred = $.isFunction($.Deferred) ? $.Deferred() : 0,
                hasNotify = $.isFunction(deferred.notify),
                $images = $this.find('img').add($this.filter('img')),
                loaded = [],
                proper = [],
                broken = [];

        // Register deferred callbacks
        if ($.isPlainObject(callback)) {
            $.each(callback, function(key, value) {
                if (key === 'callback') {
                    callback = value;
                } else if (deferred) {
                    deferred[key](value);
                }
            });
        }

        function doneLoading() {
            var $proper = $(proper),
                    $broken = $(broken);

            if (deferred) {
                if (broken.length) {
                    deferred.reject($images, $proper, $broken);
                } else {
                    deferred.resolve($images);
                }
            }

            if ($.isFunction(callback)) {
                callback.call($this, $images, $proper, $broken);
            }
        }

        function imgLoadedHandler(event) {
            imgLoaded(event.target, event.type === 'error');
        }

        function imgLoaded(img, isBroken) {
            // don't proceed if BLANK image, or image is already loaded
            if (img.src === BLANK || $.inArray(img, loaded) !== -1) {
                return;
            }

            // store element in loaded images array
            loaded.push(img);

            // keep track of broken and properly loaded images
            if (isBroken) {
                broken.push(img);
            } else {
                proper.push(img);
            }

            // cache image and its state for future calls
            $.data(img, 'imagesLoaded', {
                isBroken: isBroken,
                src: img.src
            });

            // trigger deferred progress method if present
            if (hasNotify) {
                deferred.notifyWith($(img), [isBroken, $images, $(proper), $(broken)]);
            }

            // call doneLoading and clean listeners if all images are loaded
            if ($images.length === loaded.length) {
                setTimeout(doneLoading);
                $images.unbind('.imagesLoaded', imgLoadedHandler);
            }
        }

        // if no images, trigger immediately
        if (!$images.length) {
            doneLoading();
        } else {
            $images.bind('load.imagesLoaded error.imagesLoaded', imgLoadedHandler)
                    .each(function(i, el) {
                var src = el.src;

                // find out if this image has been already checked for status
                // if it was, and src has not changed, call imgLoaded on it
                var cached = $.data(el, 'imagesLoaded');
                if (cached && cached.src === src) {
                    imgLoaded(el, cached.isBroken);
                    return;
                }

                // if complete is true and browser supports natural sizes, try
                // to check for image status manually
                if (el.complete && el.naturalWidth !== undefined) {
                    imgLoaded(el, el.naturalWidth === 0 || el.naturalHeight === 0);
                    return;
                }

                // cached images don't fire load sometimes, so we reset src, but only when
                // dealing with IE, or image is complete (loaded) and failed manual check
                // webkit hack from http://groups.google.com/group/jquery-dev/browse_thread/thread/eee6ab7b2da50e1f
                if (el.readyState || el.complete) {
                    el.src = BLANK;
                    el.src = src;
                }
            });
        }

        return deferred ? deferred.promise($this) : $this;
    };

})(jQuery);

(function() {
    Util.setTopBar()
    Util.replaceSideEm($(".comments .vditor-reset"));
    Util.buildTags("tagsSide");

    timeline.init();
})();